home *** CD-ROM | disk | FTP | other *** search
Wrap
/****************************************************************************** MODULE VarAddes.c Some Variable Manipulation Commands DESCRIPTION XDME Command Module BUGS none known TODO tell me EXAMPLES SEE ALSO INDEX HISTORY 12-11-94 b_noll created ******************************************************************************/ /************************************** Includes **************************************/ /* #include "defs.h" */ #include "xdme_base.h" /************************************** Internal Defines & Structures **************************************/ #define VA_OK 0 #define VA_NOMEMORY 1 #define VA_POSITION2FAR 2 #define VA_UNKNOWNPOS 3 #define VA_PATTERNNOTFOUND 4 #define VA_NOSUCHVAR 5 #define VA_VARNOTSET 6 #define ALNUM "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" /************************************** Macros **************************************/ #define ToAssign(cp) do{ while ((*cp) && (*cp != '=')) cp++; if (*cp) cp++; }while(0) /************************************** Implementation **************************************/ /* delete max len characters in a string */ void strdel (char *str, int len) { int rlen; rlen = strlen (str); if (rlen < len) len = rlen; rlen -= len; /* ---- this works only, if strcpy() walks from start to end */ strcpy (str, str + len); /* for sure the following way should be used: */ /* strncpy (str, str+len, len); */ /* if (rlen > len) */ /* strcpy (str+len, str+len+len); */ } /* strdel */ static int VA_beginVariableAccess (const char *vname, const char *pos, void **vlock0, int *vlock1, char **value, ULONG *position) { *value = NULL; *vlock0 = NULL; *vlock1 = 0; *position = 0; if ((*value = GetTypedVar (vname, vlock1)) == VAR_NEX) { return VA_NOSUCHVAR; } /* if */ *vlock0 = vname; if (pos) switch (*pos | 32) { case 'c': /* character# */ ToAssign(pos); { int ipos = atoi (pos); if (ipos < 0) { ipos = strlen (*value) - (ipos - 1); *position = ipos; } else if (ipos) *position = ipos - 1; else *position = 0; } break; case 'w': /* word# */ ToAssign(pos); { int l = 0; int i = atoi (pos); //int z = 0; if (i) --i; //printf ("searching word #%d\n", i); for (pos = strpbrk(*value, ALNUM); (i && (pos)); pos = strpbrk (pos + l, ALNUM)) { //printf ("#%d:%s\n", z++, pos); --i; l = strspn (pos, ALNUM); if (!l) break; } /* for */ //printf ("rest: %d, %d, %s\n", i, l, pos); if (i || !pos) { return VA_POSITION2FAR; } /* if */ *position = pos - *value; } break; case 'p': /* pattern */ ToAssign(pos); pos = strstr (*value, pos); if (pos) *position = (ULONG)(pos - *value); else return VA_PATTERNNOTFOUND; break; case 's': /* start */ *position = 0; break; case 'e': /* end */ *position = strlen (*value); break; default: return VA_UNKNOWNPOS; } /* switch */ if (*position > strlen (*value)) { return VA_POSITION2FAR; } /* if */ return VA_OK; } /* VA_beginVariableAccess */ static void VA_endVariableAccess (void *vlock0, int vlock1, char *value) { if (value) free (value); } /* VA_endVariableAccess */ static int VA_InsTextIntoVariable (const char *vname, const char *pos, const char *text) { APTR vl0; int vl1; char *value; ULONG position; int rv; if ((rv = VA_beginVariableAccess(vname, pos, &vl0, &vl1, &value, &position)) == VA_OK) { char *buffer; if ((buffer = malloc(strlen(text) + strlen(value) + 1))) { strcpy (buffer, value); strins (buffer + position, text); rv = SetTypedVar (vl0, buffer, vl1)? VA_OK: VA_VARNOTSET; free (buffer); } else { rv = VA_NOMEMORY; } /* if */ } /* if */ VA_endVariableAccess(vl0, vl1, value); return rv; } /* VA_InsTextIntoVariable */ static int VA_RemTextFromVariable (const char *vname, const char *pos, int len) { APTR vl0; int vl1; char *value; ULONG position; int rv; if ((rv = VA_beginVariableAccess(vname, pos, &vl0, &vl1, &value, &position)) == VA_OK) { char *buffer; if ((buffer = strdup(value))) { strdel (buffer + position, len); rv = SetTypedVar (vl0, buffer, vl1)? VA_OK: VA_VARNOTSET; free (buffer); } else { rv = VA_NOMEMORY; } /* if */ } /* if */ VA_endVariableAccess(vl0, vl1, value); return rv; } /* VA_RemTextFromVariale */ static int VA_Error (int code, char ** av) { switch (code) { case VA_OK: return RET_SUCC; case VA_NOMEMORY: nomemory(); break; case VA_POSITION2FAR: error ("%s:\nPosition '%s' exceeds bounds of variable '%s'", av[0], av[2], av[1]); break; case VA_UNKNOWNPOS: error ("%s:\nUnknown position directive '%s'", av[0], av[2]); break; case VA_PATTERNNOTFOUND: error ("%s:\nPattern '%s' not found in variable '%s'", av[0], av[2], av[1]); break; case VA_NOSUCHVAR: error ("%s:\nVariable '%s' not found", av[0], av[1]); break; case VA_VARNOTSET: error ("%s:\nSet failed for '%s'", av[0], av[1]); break; default: error ("%s:\nError %ld", av[0], (long)code); } /* switch */ return RET_FAIL; } /* VA_Error */ /*************************************************** COMMAND INTERFACE ***************************************************/ /*DEFHELP #cmd var INSVAR var where value -Insert a string into the variable @{B}var@{UB} at position @{B}where@{UB}; @{B}wher@{UB} can be @{B}Char@{UB}=n a characterno, @{B}Word@{UB}=n a wordno, @{B}Start@{UB} start, @{B}End@{UB} end or @{B}Pattern@{UB}=txt a subword */ DEFUSERCMD("InsVar", 3, CF_VWM|CF_ICO|CF_COK, void, do_insV, (void), ) { VA_Error(VA_InsTextIntoVariable(av[1], av[2], av[3]), av); } /*DEFHELP #cmd var REMVAR var where len -Delete @{B}len@{UB} characters from the variable @{B}var@{UB} at position @{B}where@{UB}; @{B}wher@{UB} can be @{B}Char@{UB}=n a characterno, @{B}Word@{UB}=n a wordno, @{B}Start@{UB} start, @{B}End@{UB} end or @{B}Pattern@{UB}=txt a subword */ DEFUSERCMD("RemVar", 3, CF_VWM|CF_ICO|CF_COK, void, do_remV, (void), ) { VA_Error(VA_RemTextFromVariable(av[1], av[2], atol(av[3])), av); } /****************************************************************************** ***** END VarAddes.c ******************************************************************************/